<?php

namespace app\model;


use think\facade\Db;
use think\response\Json;
use Exception as E;
use think\facade\Cache;

class GoodsConfModel
{
    private static $_table = 'eb_goods_conf'; // 菜品表
    private static $_storeTable = 'eb_store'; // 商户表

    /** 添加菜品
     * @param $input
     * @param $token
     * @return Json
     */
    public static function add($input, $token)
    {
        try {
            // 检测当前管理员状态
            $admin = AdminModel::getInfo($token, [1], [5]);
            if ($admin instanceof Json) return $admin;
            // 获取商户id
            $storeId = Db::table(self::$_storeTable)->where('admin_id', $admin['id'])->value('id');
            if (!$storeId) return jsonFail('未找到商户信息');
            $input['goods_id'] = 0;
            $input['store_id'] = $storeId;
            $input['stock'] = 0;
            $input['create_time'] = time();
            $where = "not exists (select id from eb_goods_conf where store_id = {$storeId} and name = '{$input['name']}' limit 1)";
            $sql = makeDualSql(self::$_table, $input, $where);
            $rtn = Db::table(self::$_table)->execute($sql);
            if ($rtn) return jsonSuccess('添加成功');
            return jsonFail('可能您已添加过该菜品,添加失败');
        } catch (E $e) {
            return jsonFail('服务内部错误~');
        }
    }

    /**列表
     * @param $input
     * @param $token
     * @return Json
     */
    public static function list($input, $token)
    {
        try {
            // 检测当前管理员状态
            $admin = AdminModel::getInfo($token, [1], [5]);
            if ($admin instanceof Json) return $admin;
            // 获取商户id
            $storeId = Db::table(self::$_storeTable)->where('admin_id', $admin['id'])->value('id');
            if (!$storeId) return jsonFail('未找到商户信息');
            $map[] = ['store_id', '=', $storeId];
            $map[] = ['status', '=', 1];
            if ($input['type'] !== '') $map[] = ['type', '=', $input['type']];
            if ($input['is_show'] !== '') $map[] = ['is_show', '=', $input['is_show']];
            if ($input['name'] !== '') $map[] = ['name', 'like', "%{$input['name']}%"];
            $field = 'id,name,type,stock,is_show,FROM_UNIXTIME(create_time, "%Y-%m-%d %H:%i:%s") AS create_time';
            $table = Db::table(self::$_table)
                ->field($field)
                ->where($map);
            $count = $table->count();
            if ($count == 0) return jsonSuccess('获取成功！', ['count' => $count, 'list' => []]);
            $data = $table->order('create_time', 'desc')->page($input['page'], $input['limit'])->select()->toArray();
            return jsonSuccess('获取成功！', ['count' => $count, 'list' => $data]);
        } catch (E $e) {
            return jsonFail('服务内部错误~');
        }
    }


    /** 编辑菜品库存
     * @param $input
     * @param $token
     * @return Json
     */
    public static function editStock($input, $token)
    {
        try {
            // 检测当前管理员状态
            $admin = AdminModel::getInfo($token, [1], [5]);
            if ($admin instanceof Json) return $admin;
            // 获取商户id
            $storeId = Db::table(self::$_storeTable)->where('admin_id', $admin['id'])->value('id');
            if (!$storeId) return jsonFail('未找到商户信息');
            $input['stock'] = abs(intval($input['stock']));
            $rtn = Db::table(self::$_table)->update($input);
            if ($rtn) return jsonSuccess('库存变动成功');
            return jsonSuccess('库存变动失败');
        } catch (E $e) {
            return jsonFail('服务内部错误~');
        }
    }

    /**修改菜品上下架
     * @param $input
     * @param $token
     * @return Json
     */
    public static function changeShow($input, $token)
    {
        try {
            // 检测当前管理员状态
            $admin = AdminModel::getInfo($token, [1], [5]);
            if ($admin instanceof Json) return $admin;
            // 获取商户id
            $storeId = Db::table(self::$_storeTable)->where('admin_id', $admin['id'])->value('id');
            if (!$storeId) return jsonFail('未找到商户信息');
            $map = [
                ['id', '=', $input['id']],
                ['store_id', '=', $storeId],
                ['is_show', '=', $input['is_show'] == 1 ? 0 : 1]
            ];
            $update = [
                'is_show' => $input['is_show']
            ];
            $res = Db::table(self::$_table)->where($map)->update($update);
            if ($res) return jsonSuccess('修改成功');
            return jsonFail('数据没有变化，请刷新页面重试');
        } catch (E $e) {
            return jsonFail('服务内部错误~');
        }
    }

    /**批量下架菜品
     * @param $input
     * @param $token
     * @return Json
     */
    public static function confMultiOff($input, $token)
    {
        try {
            // 检测当前管理员状态
            $admin = AdminModel::getInfo($token, [1], [5]);
            if ($admin instanceof Json) return $admin;
            $map = [
                ['id', 'in', $input['ids']],
            ];
            $update = [
                'is_show' => 0
            ];
            $res = Db::table(self::$_table)->where($map)->update($update);
            if ($res) return jsonSuccess('修改成功');
            return jsonFail('修改失败');
        } catch (E $e) {
            return jsonFail('服务内部错误~');
        }
    }

    /** 获取单个菜品信息
     * @param $input
     * @param $token
     * @return Json
     */
    public static function getOnly($input, $token)
    {
        try {
            // 检测当前管理员状态
            $admin = AdminModel::getInfo($token, [1], [5]);
            if ($admin instanceof Json) return $admin;
            // 获取商户id
            $storeId = Db::table(self::$_storeTable)->where('admin_id', $admin['id'])->value('id');
            if (!$storeId) return jsonFail('未找到商户信息');
            // 获取单个信息
            $map = [
                ['id', '=', $input['id']],
                ['store_id', '=', $storeId]
            ];
            $rtn = Db::table(self::$_table)->field("id,name,type")->where($map)->find();
            if ($rtn) return jsonSuccess('获取成功', $rtn);
            return jsonFail('未找到信息');
        } catch (E $e) {
            return jsonFail('服务内部错误~');
        }
    }

    /** 编辑菜品
     * @param $input
     * @param $token
     * @return Json
     */
    public static function edit($input, $token)
    {
        try {
            // 检测当前管理员状态
            $admin = AdminModel::getInfo($token, [1], [5]);
            if ($admin instanceof Json) return $admin;
            // 获取商户id
            $storeId = Db::table(self::$_storeTable)->where('admin_id', $admin['id'])->value('id');
            if (!$storeId) return jsonFail('未找到商户信息');
            // 获取单个信息
            $map = [
                ['id', '=', $input['id']],
                ['store_id', '=', $storeId]
            ];
            $rtn = Db::table(self::$_table)->where($map)->update(['name' => $input['name'], 'type' => $input['type']]);
            if ($rtn) return jsonSuccess('编辑成功');
            return jsonFail('数据没有更改，编辑失败');
        } catch (E $e) {
            return jsonFail('服务内部错误~');
        }
    }

    /**删除菜品
     * @param $input
     * @param $token
     * @return Json
     */
    public static function del($input, $token)
    {
        try {
            /// 检测当前管理员状态
            $admin = AdminModel::getInfo($token, [1], [5]);
            if ($admin instanceof Json) return $admin;
            // 获取商户id
            $storeId = Db::table(self::$_storeTable)->where('admin_id', $admin['id'])->value('id');
            if (!$storeId) return jsonFail('未找到商户信息');
            // 获取单个信息
            $map = [
                ['id', '=', $input['id']],
                ['store_id', '=', $storeId],
                ['status', '=', 1]
            ];
            $rtn = Db::table(self::$_table)->where($map)->update(['status' => 0]);
            if ($rtn) return jsonSuccess('删除成功');
            return jsonFail('数据可能已不在，请刷新重试');
        } catch (E $e) {
            return jsonFail('服务内部错误~');
        }
    }

    /**商户获取商品分类列表
     * @return Json
     */
    public static function storeGetList($id)
    {
        try {
            $info = Db::table(self::$_table)->where('store_id', $id)->where('status', 1)->select()->toArray();
            return jsonSuccess('获取成功', $info);
        } catch (E $e) {
            return jsonFail('服务内部错误~');
        }
    }

    /**商户添加套餐列表
     * @return Json
     */
    public static function storeAddList($token, $input)
    {
        // 判断商户是否有效
        $storeId = Cache::store('redis')->handler()->get($token);
        if (!$storeId) return jsonFail('获取商户信息失败');
        $storeStatus = Db::table(self::$_storeTable)->where('id', $storeId)->value('status');
        if ($storeStatus === null) return jsonFail('该商户不存在');
        // 0 未审核 1已审核 2审核未通过 3已禁用
        if ($storeStatus == 0) return jsonFail('该商户未审核,不能添加商品');
        if ($storeStatus == 2) return jsonFail('该商户审核未通过,不能添加商品');
        if ($storeStatus == 3) return jsonFail('该商户已禁用,不能添加商品');
        $input['is_show'] = abs($input['is_show']);
        $input['stock'] = intval(abs($input['stock']));
        $input['type'] = abs($input['type']);
        $input['create_time'] = time();
        Db::startTrans();
        try {
            $rtn = Db::table(self::$_table)->insertGetId($input);
            if ($rtn != 0) {
                Db::commit();
                return jsonSuccess('添加成功');
            } else {
                Db::rollback();
                return jsonFail('添加失败');
            }
        } catch (E $e) {
            Db::rollback();
            if ($e->getCode() == 10501) {
                return jsonFail('不能添加重复记录哦');
            } else {
                return jsonFail($e->getMessage());
            }
        }
    }

    /**商户修改套餐列表
     * @return Json
     */
    public static function storeEditList($token, $id, $input)
    {
        // 判断商户是否有效
        $storeId = Cache::store('redis')->handler()->get($token);
        if (!$storeId) return jsonFail('获取商户信息失败');
        $storeStatus = Db::table(self::$_storeTable)->where('id', $storeId)->value('status');
        if ($storeStatus === null) return jsonFail('该商户不存在');
        // 0 未审核 1已审核 2审核未通过 3已禁用
        if ($storeStatus == 0) return jsonFail('该商户未审核,不能添加商品');
        if ($storeStatus == 2) return jsonFail('该商户审核未通过,不能添加商品');
        if ($storeStatus == 3) return jsonFail('该商户已禁用,不能添加商品');
        $input['is_show'] = abs($input['is_show']);
        $input['status'] = abs($input['status']);
//        $input['type'] = abs($input['type']);
        $input['stock'] = intval(abs($input['stock']));
        unset($input['id']);
        Db::startTrans();
        try {
            $rtn = Db::table(self::$_table)->where('id', $id)->update($input);
            if ($rtn != 0) {
                Db::commit();
                return jsonSuccess('修改成功');
            } else {
                Db::rollback();
                return jsonFail('修改失败');
            }
        } catch (E $e) {
            Db::rollback();
            return jsonFail($e->getMessage());
        }
    }
}